Apache Supersetのバックアップとコンフィグ設定をしてみた
こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。
先日「Apache Superset」のSnowflakeへの接続を試しました。
このときに、データセットやチャートを追加したのですが、これらのデータがこのままだとバックアップできないことに気づきました。今回は、Dockerコンテナの作り直しやミスでデータが失われないように、バックアップをできるようにしたいと思います。
また、サンプルデータのダッシュボードを触っているときに地図がうまく表示できていないことにも気付いたので、こちらも併せて対応したいと思います。
前提
環境は以下で試しています。
- OS
- macOS Catalina
- Docker Desktop
- 2.3.0.3
また、下記エントリで一通りのSupersetのセットアップは実施済みです。
調査
まずは、必要な情報を集めてみました。ポイントは以下です。
- Supersetのデータはどこにあるのか?
- 地図が表示できていない理由はなにか?
Supersetのデータはどこにあるのか?
まず、バックアップすべきデータがどこにあるのかですが、こちらの記事に記載があるようにデフォルトでは、データはSQLLiteのファイルとして~/.superset/superset.db
に保存されているようです。
一方で、2021/02/12現在、Docker Hubで公開されているコンテナapache/incubator-superset
の場合、ちょっとパスが異なり/app/superset_home/superset.db
に保存されていました。デフォルト設定の場合、このファイルをバックアップしておけばよさそうです。
また、SupersetはSQLAlchemyを利用しているので、superset_config.py
でSQLALCHEMY_DATABASE_URI
を上書き指定してあげれば、保存先のパスを変えたり、接続先をPostgreSQLに変更したりすることもできそうです。
地図が表示できていない理由はなにか?
サンプルのダッシュボード「deck.gl Demo」ですが、特に設定をしていないと以下のようになっています。
Supersetでは地図のベースマップとして、Mapboxを利用していますが、NO_TOKEN_WARNING
と出ているとおり、Mapboxのトークン設定ができていないので、このような表示となっています。
公式ドキュメントのFAQにもある通り、設定をするためには、superset_config.py
にMAPBOX_API_KEY
を設定すれば良さそうです。
Why is the map not visible in the geospatial visualization?
You need to register a free account at Mapbox.com, obtain an API key, and add it to superset_config.py at the key MAPBOX_API_KEY:
MAPBOX_API_KEY = "longstringofalphanumer1c"
superset_config.py はどこにあるのか?
ということで、今度はsuperset_config.py
がどこにあるのかなのですが、デフォルトではこのファイルは存在していません。下記のドキュメントに記載の通り、PYTHONPATH
に自分で作成する必要があります。
Docker Hubで公開されているコンテナapache/incubator-superset
の場合、PYTHONPATH
は/app/pythonpath
に設定されていたので、ここに作成すれば良さそうです。
docker-compose.yml を修正する
ここまでで、必要な情報は集まったので対応していきます。バックアップと設定ファイルの作成にはDockerコンテナ内のディレクトリをバインドマウントしておくと良さそうなので、以下のようにvolumes
の設定を追加します。
version: "3.7" services: superset: build: context: ./build/superset args: SUPERSET_ADMIN_USERNAME: $SUPERSET_ADMIN_USERNAME SUPERSET_ADMIN_FIRSTNAME: $SUPERSET_ADMIN_FIRSTNAME SUPERSET_ADMIN_LASTNAME: $SUPERSET_ADMIN_LASTNAME SUPERSET_ADMIN_EMAIL: $SUPERSET_ADMIN_EMAIL SUPERSET_ADMIN_PASSWORD: $SUPERSET_ADMIN_PASSWORD ports: - "8080:8080" volumes: - type: bind source: ./data/superset_home target: /app/superset_home - type: bind source: ./data/pythonpath target: /app/pythonpath
また、バインドマウントできるように事前にディレクトリを作成し、以下のようにディレクトリ構成を修正しておきます。
superset ┣ build ┃ ┗ superset ┃ ┣ Dockerfile ┃ ┗ requirements.txt ┣ data ┃ ┣ superset_home ┃ ┗ pythonpath ┣ .env ┗ docker-compose.yml
この状態で、docker-compose up -d
とすれば、うまくマウントできるかと思います。
バックアップしてみる
この状態でコンテナを起動すると、data/superset_home/superset.db
が見えるようになります。このファイルをバックアップしておけば良いですね。
今回は試しにコンテナ内に入ってみて、ファイルをリネームしてバックアップし、データをすべて初期化してみます。
$ cp /app/superset_home/superset.db /app/superset_home/superset.db.20210212 $ rm /app/superset_home/superset.db $ superset fab create-admin --username admin --firstname Superset --lastname Admin --email [email protected] --password admin $ superset db upgrade $ superset init
すっかり空っぽになりました。
では、バックアップファイルから戻してみましょう。
$ cp /app/superset_home/superset.db.20210212 /app/superset_home/superset.db
無事に戻ってきました!良さそうですね。今回はコンテナ内でバックアップ(cp)をしましたが、バインドマウントしているので、通常はホスト側でバックアップすれば問題ありません。
ベース地図を表示させてみる
Dockerのホスト側で以下のようにsuperset_config.py
ファイルを作成し、MAPBOX_API_KEY
を設定します。キーはドキュメントに記載があった通り、Mapboxでフリーアカウントを作成して取得したキーを利用します。
MAPBOX_API_KEY="pk.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
このように設定したsuperset_config.py
を配置した状態でSupersetを起動すると、以下のように地図が表示されます。
やはりベース地図が表示されていると、とても良い感じになりますね!
まとめ
以上、Apache Supersetのバックアップとコンフィグ設定をしてみました。データのバックアップ方法も分かり、環境設定ファイルの作成もできたので、これで心置きなく色々設定ができそうです。データは定期的にバックアップするようにスクリプトで設定してもよさそうですね。
どなたかのお役に立てば幸いです。それでは!